package com.shujia.ml

import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.{SparseVector, Vectors}

object Code01Ver {
  def main(args: Array[String]): Unit = {
    /**
     * Spark机器学习包：
     * ml:DataFrame
     * mllib:RDD
     *
     * Spark机器学习中对于数据的表示方式为 一个向量
     * 向量分为两种形式：
     * 1.稠密向量 Dense 将所有的数据进行保存
     * 2.稀疏向量 Sparse  将所有不为0的数据保存下来，减少数据量 提高执行效率
     *
     * labeledPoint：
     *    在Spark中做有监督学习时，调用其机器学习算法，需要有标准的数据传入格式
     *
     */



    // 稠密向量
    val denseVector: linalg.Vector = Vectors.dense(1.0, 2, 3)
    println(denseVector)

    val denseVector2: linalg.Vector = Vectors.dense(1.0, 0, 3, 0, 0, 0, 4)
    val sparse1: SparseVector = denseVector2.toSparse
    // (7,[0,2,6],[1.0,3.0,4.0]) => 7表示一共7位数据 [0,2,6] 该数组表示数据所在下标位置  [1.0,3.0,4.0] 表示所有不为0的数据
    println(sparse1)

    // 创建一个稀疏向量并转成稠密向量
    val sparse2: linalg.Vector = Vectors.sparse(10, Array(0, 2, 4), Array(1, 2, 3))
    println(sparse2.toDense)

    // 对于有监督学习中的有标签数据如何进行保存
    //  label: Double,  标签
    //  features: Vector 特征
    val labeledPoint: LabeledPoint = LabeledPoint(1, Vectors.dense(Array(1.0, 2, 3, 4)))
    println(labeledPoint)
    println(labeledPoint.label) // 取出标签
    println(labeledPoint.features) // 取出特征




  }
}
